package com.gqr.syc;

/*
* 类锁的第一种形式 static形式
*
* */
public class SynchronizedClassStatic4 implements Runnable{

    private static SynchronizedClassStatic4 instance1 = new SynchronizedClassStatic4();
    private static SynchronizedClassStatic4 instance2 = new SynchronizedClassStatic4();

    @Override
    public void run() {
        method();
    }
    /*
    * 1. 两个线程运行不同的对象(instance1，instance2) method方法不增加static修饰 两个线程会同时执行method方法没有相互等待的状态 没有锁住
    *   因为synchronized修饰普通方法时 默认的锁对象指向this当前实例对象 instance1和instance2 是不同的实例对象 也就是2把锁 互不影响
    * 2. method方法 增加static修饰 就是类锁， 虽然不同线程运行了2个对象 instance1和instance2  但是二者都是SynchronizedClassStatic4类 该类是唯一的 锁也就是唯一的
    * */
    public static synchronized void method() {
        System.out.println("我是对象锁的方法修饰符形式，我叫"+Thread.currentThread().getName());
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        /*
         * 在这里打一个断点  可以在debug控制台发现 Thread-0是running Thread-1是monitor(就是在等待锁被Thread-0释放)
         * */
        System.out.println(Thread.currentThread().getName()+"运行结束");
    }


    public static void main(String[] args) {
        Thread t1 = new Thread(instance1);
        Thread t2 = new Thread(instance2);
        t1.start();
        t2.start();
        while (t1.isAlive() || t2.isAlive()) {

        }
        System.out.println("finished");
    }
}
